﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Quaack
{
    public partial class EigenPagina : System.Web.UI.Page
    {
        // Definieer een gebruikersobject voor deze pagina
        Gebruiker paginaEigenaar;
        
        // Definieer een gebruikersobject voor degene die de pagina bekijkt
        Gebruiker huidigeGebruiker;

        // Defineer de url voor het navigeren naar een ander profiel
        string urlProfiel = "~/Eigenpagina.aspx?Profiel=";

        // Page Pre-init
        protected void Page_PreInit(object sender, EventArgs e)
        {
            //check of gebruiker is ingelogd of niet en stel juiste masterpage in
            string name = HttpContext.Current.User.Identity.Name;

            if (string.IsNullOrEmpty(name))
            {
                Page.MasterPageFile = "~/QuaackMasterSiteAnonymous.Master";
            }
            else
            {
                Page.MasterPageFile = "~/QuaackMasterSiteLoggedIn.Master";
            }
        }

        // Page Load
        protected void Page_Load(object sender, EventArgs e)
        {
            // Haal de eigenaar van de eigenpagina en de huidige gebruiker op
            paginaEigenaar = PaginaEigenaarOphalen();
            huidigeGebruiker = HuidigeGebruikerOphalen();

            // Controleer of de huidige gebruiker een administrator is
            if (Roles.IsUserInRole(User.Identity.Name, "Admin"))
            {
                if (this.btnAdminBlock != null) this.btnAdminBlock.Visible = true;
            }

            else
            {
                if (this.btnAdminBlock != null) this.btnAdminBlock.Visible = false;
            }

            // Vul de eigenpagina van de gebruiker
            if (paginaEigenaar != null)
            {
                // Haal alle berichten op van deze gebruiker
                List<Bericht> berichtenLijst = new Bericht().BerichtenOphalen(paginaEigenaar);

                // Weergeef gerelateerde berichten voor deze gebruiker
                BerichtenWeergeven(paginaEigenaar, berichtenLijst);

                // Weergeef gerelateerde gebruikers bij dit profiel
                GebruikersWeergeven(paginaEigenaar);

                // Weergeef de avatar van deze gebruiker
                AvatarWeergeven(paginaEigenaar);
            }
            else
            {
                // Laat de gebruiker terugkeren naar de hoofdpagina indien deze handmatig (bv. via de adresbalk) op
                // de eigenpagina probeer te komen terwijl de gebruiker een bezoeker is zonder eigenpagina.
                Response.Redirect("~/");
            }

            // Controleer of de gebruiker is geblokkeerd
            if (new Gebruiker().GebruikerIsGeblokkeerd(huidigeGebruiker, paginaEigenaar))
            {
                this.btnBerichtPlaatsen.Enabled = false;
            }

            // Controleer of de gebruiker is ingelogd om te bepalen welke controls er beschikbaar zijn
            if (GebruikerAnoniem())
            {
                this.btnBerichtPlaatsen.Visible = false;
                this.btnGebruikerBlokkeren.Visible = false;
            }

            // Controleer of de blokkerenknop aanwezig moet zijn voor de gebruiker
            if (paginaEigenaar.ProfielID == huidigeGebruiker.ProfielID)
            {
                this.btnGebruikerBlokkeren.Visible = false;
            }

            // Controleer of de gebruiker toevallig al is geblokkeerd
            if (new Gebruiker().GebruikerIsGeblokkeerd(paginaEigenaar, huidigeGebruiker))
            {
                this.btnGebruikerBlokkeren.Text = "Deblokkeren";
            }
            else
            {
                this.btnGebruikerBlokkeren.Text = "Blokkeren";
            }
        }

        // Interne functies
        /// <summary>
        /// Deze functie weergeeft alle berichten en reacties van deze gebruiker
        /// </summary>
        /// <param name="gebruiker"></param>
        private void BerichtenWeergeven(Gebruiker gebruiker, List<Bericht> berichtenLijst)
        {
            // Maak het berichtenpaneel leeg
            this.pnlBerichten.Controls.Clear();

            // Voeg alle hoofdberichten en reacties toe aan de lijsten
            #region Genereer de lijsten voor alle berichten en reacties

            // Maak een lijst met berichten en reacties
            List<Bericht> hoofdberichtenLijst = new List<Bericht>();
            List<Bericht> reactieLijst = new List<Bericht>();

            // Genereer de lijsten
            for (int i = 0; i < berichtenLijst.Count; i++)
            {
                if (berichtenLijst[i].HoofdBericht.BerichtID == -1)
                {
                    hoofdberichtenLijst.Add(berichtenLijst[i]);
                }
                else
                {
                    reactieLijst.Add(berichtenLijst[i]);
                }
            }
            #endregion

            // Voeg alle hoofdberichten toe aan het berichtenpaneel en voeg alle bijbehorende reacties toe
            #region Loop door de lijsten en genereer de berichten en reacties
            for (int i = 0; i < hoofdberichtenLijst.Count; i++)
            {
                // Voeg alleen berichten en reacties toe die niet zijn verwijderd
                if (!hoofdberichtenLijst[i].Verwijderd)
                {
                    // Haal het hoofdbericht op en zet deze om tot een HTML bericht
                    Panel pnlHoofdBericht = new Panel();
                    pnlHoofdBericht = BerichtControlMaken(hoofdberichtenLijst[i]);

                    // Voeg het hoofdbericht toe aan het berichtenpaneel
                    this.pnlBerichten.Controls.Add(pnlHoofdBericht);

                    // Voeg alle reacties toe die bij het hoofdbericht horen
                    for (int i2 = 0; i2 < reactieLijst.Count; i2++)
                    {
                        // Voeg alleen reacties toe die bij het hoofdbericht horen
                        if (reactieLijst[i2].HoofdBericht.BerichtID == hoofdberichtenLijst[i].BerichtID && !reactieLijst[i2].Verwijderd)
                        {
                            // Haal de reactie op en zet deze om tot een HTML bericht
                            Panel pnlReactie = new Panel();
                            pnlReactie = BerichtControlMaken(reactieLijst[i2]);

                            // Voeg de reactie toe aan het berichtenpaneel, direct onder het hoofdbericht
                            this.pnlBerichten.Controls.Add(pnlReactie);
                        }
                    }

                    // Voeg een nieuwe horizontale regel toe indien dit bericht een reactie is
                    this.pnlBerichten.Controls.Add(new LiteralControl("<hr />"));
                }
            }
            #endregion

            // Controleer of er uberhaubt berichten zijn
            if (hoofdberichtenLijst.Count == 0)
            {
                this.pnlBerichten.Controls.Add(new LiteralControl("Er zijn nog geen berichten geplaatst."));
            }
        }

        /// <summary>
        /// Deze functie maakt een HTML bericht van een bericht object
        /// </summary>
        /// <param name="bericht"></param>
        /// <returns></returns>
        private Panel BerichtControlMaken(Bericht bericht)
        {
            // Het bericht kan worden opgedeeld in twee grote delen, de avatar en een subpaneel.
            // Deze twee worden stuk voor stuk opgebouwd en uiteindelijk toegevoegd aan het hoofdpaneel.

            // 1. Definieer het hoofdpaneel
            #region Bericht hoofdpaneel
            // Maak een nieuw paneel voor het bericht en de controls
            Panel pnlBerichtHP = new Panel();

            // Bepaal of het bericht een reactie betreft en pas de juiste css-class toe
            if (bericht.HoofdBericht.BerichtID == -1)
            {
                pnlBerichtHP.CssClass = "eigenpagina_bericht";
            }
            else
            {
                pnlBerichtHP.CssClass = "eigenpagina_reactie";
            }
            #endregion

            // 2. Definieer een avatar control
            #region Avatar control
            // Maak een nieuw paneel voor de avatar
            Panel pnlAvatar = new Panel();
            pnlAvatar.CssClass = "eigenpagina_avatar";

            // Maak een nieuwe instantie van een image voor de avatar
            Image imgAvatar = new Image();
            imgAvatar.ImageUrl = bericht.Zender.AvatarLocatie;
            imgAvatar.AlternateText = bericht.Zender.Gebruikersnaam;

            // Voeg de avatar toe aan het avatarpaneel
            pnlAvatar.Controls.Add(imgAvatar);

            // Voeg het avatarpaneel toe aan het hoofdpaneel
            pnlBerichtHP.Controls.Add(pnlAvatar);
            #endregion

            // 3. Definieer het subpaneel en de controls
            #region Bericht subpaneel
            // Maak een nieuw paneel voor het subpaneel voor een bericht
            Panel pnlBerichtSP = new Panel();
            #endregion

            #region Berichtdetails control
            // Maak een nieuw paneel aan voor details van het bericht
            Panel pnlDetails = new Panel();
            pnlDetails.CssClass = "eigenpagina_berichtdetails";

            // Maak een nieuwe literal aan voor de inhoud van de details
            Literal litDetails = new Literal();
            litDetails.Text = "Op " + bericht.BerichtDatum.ToString("dd-MM-yyyy") +
                " om " + bericht.BerichtDatum.ToString("hh:mm:ss") +
                " schreef " + bericht.Zender.Gebruikersnaam + ":";

            // Voeg de literal toe aan het detailpaneel
            pnlDetails.Controls.Add(litDetails);

            // Maak een reactieknop indien dit bericht zelf geen reactie is op een bericht
            #region Reactieknop
            // Controleer of het bericht geen reactie betreft
            if (bericht.HoofdBericht.BerichtID == -1 && !GebruikerAnoniem())
            {
                LinkButton lbtnReactie = new LinkButton();
                lbtnReactie.Text = "Reactie plaatsen";
                lbtnReactie.Command += lbtnReactie_Command;
                lbtnReactie.CommandArgument = bericht.BerichtID.ToString();

                // Controleer of de knop moet zijn geblokkeerd voor de gebruiker
                if ((new Gebruiker().GebruikerIsGeblokkeerd(huidigeGebruiker, paginaEigenaar)))
                {
                    lbtnReactie.Enabled = false;
                    lbtnReactie.ToolTip = "Je bent helaas door deze gebruiker geblokkeerd!";
                }

                // Voeg de knop toe aan het detailpaneel
                pnlDetails.Controls.Add(lbtnReactie);
            }
            #endregion

            // Maak een knop aan om het bericht of de reactie te kunnen verwijderen indien de huidige gebruiker de zender is,
            // of wanneer de eigenaar van de eigenpagina de huidige gebruiker is
            #region Verwijderknop
            if (bericht.Zender.ProfielID == huidigeGebruiker.ProfielID || huidigeGebruiker.ProfielID == paginaEigenaar.ProfielID)
            {
                LinkButton lbtnVerwijderen = new LinkButton();
                lbtnVerwijderen.Text = "Verwijderen";
                lbtnVerwijderen.Command += lbtnVerwijderen_Command;
                lbtnVerwijderen.CommandArgument = bericht.BerichtID.ToString();

                // Voeg de knop toe aan het detailpaneel
                pnlDetails.Controls.Add(lbtnVerwijderen);
            }
            #endregion

            // Maak een knop aan om een gebruiker te kunnen blokkeren en de eigenpagina te kunnen bekijken
            #region Blokkeerknop
            // Controleer of de zender van het bericht niet de huidige gebruiker is
            if (bericht.Zender.ProfielID != huidigeGebruiker.ProfielID && !GebruikerAnoniem())
            {
                LinkButton lbtnBlokkeren = new LinkButton();
                
                // Definieer de command en argument voor het blokkeren van een gebruiker
                // en controleer of de gebruiker toevallig al is geblokkeerd
                if (new Gebruiker().GebruikerIsGeblokkeerd(bericht.Zender, huidigeGebruiker))
                {
                    lbtnBlokkeren.Text = "Deblokkeren";
                }
                else
                {
                    lbtnBlokkeren.Text = "Blokkeren";
                }
                
                lbtnBlokkeren.Command += lbtnBlokkeren_Command;
                lbtnBlokkeren.CommandArgument = bericht.Zender.Gebruikersnaam;

                // Voeg de knop toe aan het detailpaneel
                pnlDetails.Controls.Add(lbtnBlokkeren);
            }
            #endregion

            // Controleer of de huidige eigenpagina niet hetzelfde is van degene die het bericht heeft geplaatst
            #region Eigenpaginaknop
            if (bericht.Zender.ProfielID != huidigeGebruiker.ProfielID && bericht.Zender.ProfielID != paginaEigenaar.ProfielID)
            {
                LinkButton lbtnEigenpagina = new LinkButton();

                // Definieer de command en argument voor het bekijken van de eigenpagina van een gebruiker
                lbtnEigenpagina.Text = "Eigenpagina";
                lbtnEigenpagina.Command += lbtnEigenpagina_Command;
                lbtnEigenpagina.CommandArgument = bericht.Zender.Gebruikersnaam;

                // Voeg de knop toe aan het detailpaneel
                pnlDetails.Controls.Add(lbtnEigenpagina);
            }
            

            // Voeg het detailpaneel toe aan het bericht subpaneel
            pnlBerichtSP.Controls.Add(pnlDetails);
            #endregion Eigenpaginaknop

            #endregion Berichtdetails control

            #region Berichtinhoud control
            // Maak een nieuw paneel voor de inhoud van het bericht
            Panel pnlBerichtinhoud = new Panel();
            pnlBerichtinhoud.CssClass = "eigenpagina_berichtinhoud";

            // Maak een nieuwe literal voor de inhoud van het bericht
            Literal litBericht = new Literal();
            litBericht.Text = bericht.Inhoud;

            // Voeg de literal toe aan het paneel
            pnlBerichtinhoud.Controls.Add(litBericht);

            // Voeg het berichtinhoud paneel toe aan het subpaneel
            pnlBerichtSP.Controls.Add(pnlBerichtinhoud);
            #endregion

            // 4. Voeg het bericht subpaneel toe aan het hoofdpaneel
            pnlBerichtHP.Controls.Add(pnlBerichtSP);

            // 6. Geef het opgebouwde hoofdpaneel terug
            return pnlBerichtHP;
        }

        /// <summary>
        /// Deze functie weergeeft de avatar van de gebruiker
        /// </summary>
        /// <param name="gebruiker"></param>
        private void AvatarWeergeven(Gebruiker gebruiker)
        {
            // Weergeef de avatar van deze gebruiker indien aanwezig
            if (gebruiker.AvatarLocatie != null && gebruiker.AvatarLocatie.Length > 0)
            {
                // Maak een nieuwe afbeelding en plaats de avatar van de gebruiker erin
                Image avatar = new Image();
                avatar.ImageUrl = gebruiker.AvatarLocatie;
                avatar.AlternateText = "Avatar van " + gebruiker.Gebruikersnaam;
                avatar.ToolTip = "Avatar van " + gebruiker.Gebruikersnaam;

                // Voeg de afbeelding toe aan het avatar paneel
                this.pnlAvatar.Controls.Add(avatar);
            }
        }

        /// <summary>
        /// Deze functie weergeeft alle gebruikers die een reactie hebben geplaatst en waarbij een reactie is geplaatst
        /// </summary>
        /// <param name="ontvanger">De ontvanger van alle reacties die zijn geplaatst of die deze heeft geplaatst</param>
        private void GebruikersWeergeven(Gebruiker ontvanger)
        {
            // Haal de lijsten op met reageerders en ontvangers
            List<Gebruiker> reageerdersLijst = new Bericht().ReageerdersOphalen(ontvanger);
            List<Gebruiker> ontvangersLijst = new Bericht().OntvangersOphalen(ontvanger);

            // Vul het paneel met alle reageerders
            foreach (Gebruiker gebruiker in reageerdersLijst)
            {
                // Voeg alleen gebruikers toe die niet de eigenaar van de eigenpagina zijn
                if (gebruiker.ProfielID != paginaEigenaar.ProfielID)
                {
                    // Maak een nieuw paneel voor de reageerder
                    Panel pnlReageerder = new Panel();

                    // Maak een nieuwe literal voor de reageerder
                    Literal litReageerder = new Literal();
                    litReageerder.Text = gebruiker.Gebruikersnaam;

                    // Voeg de literal toe aan het paneel
                    pnlReageerder.Controls.Add(litReageerder);

                    // Maak een nieuwe linkbutton voor de eigenpagina van de reageerder
                    LinkButton lbtnReageerder = new LinkButton();
                    lbtnReageerder.Text = "Eigenpagina bezoeken";
                    lbtnReageerder.PostBackUrl = urlProfiel + gebruiker.Gebruikersnaam;

                    // Voeg de linkbutton toe aan het paneel
                    pnlReageerder.Controls.Add(lbtnReageerder);

                    // Voeg het paneel met de reageerder toe aan de controls
                    this.pnlReageerders.Controls.Add(pnlReageerder);
                }
            }

            // Vul het paneel met alle ontvangers
            foreach (Gebruiker gebruiker in ontvangersLijst)
            {
                // Voeg alleen gebruikers toe die niet de eigenaar van de eigenpagina zijn
                if (gebruiker.ProfielID != paginaEigenaar.ProfielID)
                {
                    // Maak een nieuwe paneel voor de ontvanger
                    Panel pnlOntvanger = new Panel();

                    // Maak een nieuwe literal voor de ontvanger
                    Literal litOntvanger = new Literal();
                    litOntvanger.Text = gebruiker.Gebruikersnaam;

                    // Voeg de literal toe aan het paneel
                    pnlOntvanger.Controls.Add(litOntvanger);

                    // Maak een nieuwe linkbutton voor de eigenpagina van de ontvanger
                    LinkButton lbtnOntvanger = new LinkButton();
                    lbtnOntvanger.Text = "Eigenpagina bezoeken";
                    lbtnOntvanger.PostBackUrl = urlProfiel + gebruiker.Gebruikersnaam;

                    // Voeg de linkbutton toe aan het paneel
                    pnlOntvanger.Controls.Add(lbtnOntvanger);

                    // Voeg het paneel met de reageerder toe aan de controls
                    this.pnlOntvangers.Controls.Add(pnlOntvanger);
                }
            }
        }

        /// <summary>
        /// Deze functie sluit alle pop-ups en wist de inhoud van de textboxes die daar in zitten
        /// </summary>
        private void PopupWissenEnSluiten()
        {
            // Wis de textboxes van de pop-ups
            this.tboxBericht.Text = string.Empty;
            this.tboxReactie.Text = string.Empty;
            this.lblBlokkeren.Text = string.Empty;

            // Verberg de pop-ups
            this.pnlReactiePlaatsen.Visible = false;
            this.pnlBerichtPlaatsen.Visible = false;
            this.pnlBerichtVerwijderen.Visible = false;
            this.pnlGebruikerBlokkeren.Visible = false;
        }

        /// <summary>
        /// Deze functie haalt alle nieuwe berichten binnen en ververst de controls
        /// </summary>
        private void PaginaVerversen()
        {
            Response.Redirect(ProfielUrl());
        }

        /// <summary>
        /// Met deze functie kan een gebruiker worden geblokkeerd op basis van de gebruikersnaam.
        /// De gebruiker die is ingelogd is uiteraard degene die de blokkade instelt.
        /// </summary>
        /// <param name="gebruikersnaam">De gebruiker die moet worden geblokkeerd.</param>
        private void BlokkeerGebruiker(Gebruiker gebruiker)
        {
            // Blokkeer de opgegeven gebruiker bij de huidige gebruiker
            if (gebruiker != null && huidigeGebruiker != null)
            {
                new Gebruiker().GebruikerBlokkeren(huidigeGebruiker, gebruiker);
            }
        }

        /// <summary>
        /// Met deze functie kan een gebruiker worden gedeblokkeerd op basis van de gebruikersnaam.
        /// De gebruiker die is ingelogd is uiteraard degene die de deblokkade instelt.
        /// </summary>
        /// <param name="gebruikersnaam">De gebruiker die moet worden gedeblokkeerd.</param>
        private void DeblokkeerGebruiker(Gebruiker gebruiker)
        {
            // Blokkeer de opgegeven gebruiker bij de huidige gebruiker
            if (gebruiker != null && huidigeGebruiker != null)
            {
                new Gebruiker().GebruikerDeblokkeren(huidigeGebruiker, gebruiker);
            }
        }

        /// <summary>
        /// Deze functie haalt de huidige gebruiker op die de eigen pagina bekijkt
        /// </summary>
        /// <returns>De gebruiker die de eigen pagina bekijkt</returns>
        private Gebruiker HuidigeGebruikerOphalen()
        {
            // Haal de gebruikersnaam op uit de identiteit indien aanwezig
            if (HttpContext.Current.User.Identity.Name != string.Empty)
            {
                return new Gebruiker().GebruikerOpvragen(HttpContext.Current.User.Identity.Name);
            }
            else
            {
                return new Gebruiker();
            }
        }

        /// <summary>
        /// Deze functie haalt de eigenaar van de eigenpagina op
        /// </summary>
        /// <returns></returns>
        private Gebruiker PaginaEigenaarOphalen()
        {
            // Haal de gebruikersnaam op uit de sessie indien aanwezig
            if (Request.QueryString["Profiel"] != null)
            {
                return new Gebruiker().GebruikerOpvragen(Request.QueryString["Profiel"]);
            }
            // Haal anders de gebruikersnaam op uit de identiteit indien aanwezig
            else if (HttpContext.Current.User.Identity.Name != string.Empty)
            {
                return new Gebruiker().GebruikerOpvragen(HttpContext.Current.User.Identity.Name);
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Deze functie controleert of de huidige gebruiker anoniem is
        /// </summary>
        /// <returns>True indien de gebruiker anoniem is</returns>
        private bool GebruikerAnoniem()
        {
            if (huidigeGebruiker.Gebruikersnaam == "Anoniem" ||
                String.IsNullOrEmpty(huidigeGebruiker.Gebruikersnaam))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Deze functie haalt de url van de eigenpagina van het profiel op
        /// </summary>
        /// <returns></returns>
        private string ProfielUrl()
        {
            // Haal de naam van de eigenaar van de eigenpagina op uit de request
            if (Request["Profiel"] != null)
            {
                return urlProfiel + Request["Profiel"];
            }
            else
            {
                return "~/Eigenpagina.aspx";
            }
        }

        // Events uit het hoofdscherm
        protected void btnGebruikerBlokkeren_Click(object sender, EventArgs e)
        {
            if (!new Gebruiker().GebruikerIsGeblokkeerd(huidigeGebruiker, paginaEigenaar))
            {
                // Geef in de sessie aan of er wel of niet moet worden geblokkeerd
                Session["Blokkeren"] = true;
                Session["Gebruikersnaam"] = paginaEigenaar.Gebruikersnaam;

                // Toon de pop-up en stel de tekst in
                this.lblBlokkeren.Text = "Weet je zeker dat je de gebruiker " + paginaEigenaar.Gebruikersnaam + " wilt blokkeren?";
                this.pnlGebruikerBlokkeren.Visible = true;
            }
            else
            {
                // Geef in de sessie aan of er wel of niet moet worden geblokkeerd
                Session["Blokkeren"] = false;
                Session["Gebruikersnaam"] = paginaEigenaar.Gebruikersnaam;

                // Toon de pop-up en stel de tekst in
                this.lblBlokkeren.Text = "Weet je zeker dat je de gebruiker " + paginaEigenaar.Gebruikersnaam + " wilt deblokkeren?";
                this.btnBlokkeren.Text = "Deblokkeren";
                this.pnlGebruikerBlokkeren.Visible = true;
            }
        }
        protected void btnBerichtPlaatsen_Click(object sender, EventArgs e)
        {
            // Weergeef de pop-up
            this.pnlBerichtPlaatsen.Visible = true;
        }

        // Events uit de berichten en reacties
        protected void lbtnVerwijderen_Command(object sender, CommandEventArgs e)
        {
            // Zet het berichtID in de sessie
            Session["BerichtID"] = e.CommandArgument.ToString();

            // Toon de pop-up
            this.pnlBerichtVerwijderen.Visible = true;
        }
        protected void lbtnReactie_Command(object sender, CommandEventArgs e)
        {
            // Zet het HoofdBerichtID in de sessie
            Session["HoofdBerichtID"] = e.CommandArgument.ToString();

            // Toon de pop-up
            this.pnlReactiePlaatsen.Visible = true;
        }
        protected void lbtnEigenpagina_Command(object sender, CommandEventArgs e)
        {
            Response.Redirect(urlProfiel + e.CommandArgument.ToString());
        }
        protected void lbtnBlokkeren_Command(object sender, CommandEventArgs e)
        {
            // Zet de gebruiker die moet worden geblokkeerd in de sessie
            Session["Gebruikersnaam"] = e.CommandArgument.ToString();

            if (!new Gebruiker().GebruikerIsGeblokkeerd(new Gebruiker().GebruikerOpvragen(e.CommandArgument.ToString()), huidigeGebruiker))
            {
                // Geef in de sessie aan of er wel of niet moet worden geblokkeerd
                Session["Blokkeren"] = true;

                // Toon de pop-up en stel de tekst in
                this.lblBlokkeren.Text = "Weet je zeker dat je de gebruiker " + e.CommandArgument.ToString() + " wilt blokkeren?";
                this.btnBlokkeren.Text = "Blokkeren";
                this.pnlGebruikerBlokkeren.Visible = true;
            }
            else
            {
                // Geef in de sessie aan of er wel of niet moet worden geblokkeerd
                Session["Blokkeren"] = false;

                // Toon de pop-up en stel de tekst in
                this.lblBlokkeren.Text = "Weet je zeker dat je de gebruiker " + e.CommandArgument.ToString() + " wilt deblokkeren?";
                this.btnBlokkeren.Text = "Deblokkeren";
                this.pnlGebruikerBlokkeren.Visible = true;
            }
        }

        // Events uit de pop-up
        protected void btnPlaatsBericht_Click(object sender, EventArgs e)
        {
            // Controleer of de gebruiker niet toevallig is uitgelogd
            if (!GebruikerAnoniem())
            {
                // Zender is altijd de ingelogde gebruiker
                Gebruiker zender = new Gebruiker().GebruikerOpvragen(HttpContext.Current.User.Identity.Name);

                // Ontvanger is de gebruiker waar het bericht voor is bestemd. Deze is uit de url te halen,
                // maar het is mogelijk dat ook een gebruiker op zichzelf wilt reageren.
                Gebruiker ontvanger = paginaEigenaar;

                // Maak een nieuw bericht object
                Bericht bericht = new Bericht();
                bericht.Inhoud = this.tboxBericht.Text;
                bericht.Zender = zender;
                bericht.Ontvanger = ontvanger;
                bericht.BerichtDatum = DateTime.Now;

                // Plaats het bericht
                bericht.BerichtPlaatsen();
            }

            // Sluit de pop-up
            PopupWissenEnSluiten();

            // Ververs de pagina
            PaginaVerversen();
        }
        protected void btnPlaatsReactie_Click(object sender, EventArgs e)
        {
            // Controleer of de gebruiker niet toevallig is uitgelogd
            if (!GebruikerAnoniem())
            {
                // Zender is altijd de ingelogde gebruiker
                Gebruiker zender = new Gebruiker().GebruikerOpvragen(HttpContext.Current.User.Identity.Name);

                // Ontvanger is de gebruiker waar het bericht voor is bestemd. Deze is uit de url te halen,
                // maar het is mogelijk dat ook een gebruiker op zichzelf wilt reageren.
                Gebruiker ontvanger = paginaEigenaar;

                // Maak een nieuw bericht object
                Bericht bericht = new Bericht();
                bericht.Inhoud = this.tboxReactie.Text;
                bericht.Zender = zender;
                bericht.Ontvanger = ontvanger;
                bericht.BerichtDatum = DateTime.Now;

                // Plaats de reactie onder het HoofdBerichtID die in de sessie staat
                bericht.ReactiePlaatsen(Convert.ToInt32(Session["HoofdBerichtID"]));
            }

            // Sluit de pop-up
            PopupWissenEnSluiten();

            // Ververs de pagina
            PaginaVerversen();
        }
        protected void btnAnnuleren_Click(object sender, EventArgs e)
        {
            // Sluit de pop-up
            PopupWissenEnSluiten();
        }
        protected void btnBlokkeren_Click(object sender, EventArgs e)
        {
            // Controleer of de gebruiker niet toevallig is uitgelogd
            if (!GebruikerAnoniem())
            {
                if ((bool)Session["Blokkeren"] == true)
                {
                    // Blokkeer de gebruiker die is meegegeven in het argument
                    BlokkeerGebruiker(new Gebruiker().GebruikerOpvragen(Session["Gebruikersnaam"].ToString()));
                }
                else
                {
                    // Deblokkeer de gebruiker die is meegegeven in het argument
                    DeblokkeerGebruiker(new Gebruiker().GebruikerOpvragen(Session["Gebruikersnaam"].ToString()));
                }
            }

            // Sluit de pop-up
            PopupWissenEnSluiten();

            // Ververs de pagina
            PaginaVerversen();
        }
        protected void btnBerichtVerwijderen_Click(object sender, EventArgs e)
        {
            // Controleer of de gebruiker niet toevallig is uitgelogd
            if (!GebruikerAnoniem())
            {
                // Verwijder het opgegeven bericht indien de gebruiker de zender is
                if (huidigeGebruiker.ProfielID == new Bericht().ZenderOpvragen(Convert.ToInt32(Session["BerichtID"])).ProfielID)
                {
                    new Bericht().BerichtVerwijderen(Convert.ToInt32(Session["BerichtID"]), huidigeGebruiker);
                }
            }

            // Sluit de pop-up
            PopupWissenEnSluiten();

            // Ververs de pagina
            PaginaVerversen();
        }
        protected void btnAdminBlock_Click(object sender, EventArgs e)
        {
            // Controleer of de gebruiker niet toevallig is uitgelogd
            if (!GebruikerAnoniem())
            {
                new Gebruiker().ProfielBlokkeren(paginaEigenaar);
            }
        }
    }
}